In this project, we will be visualizing data on economic statistics, both global and domestic. These statistics include: Inequality, Inflation, Poverty, Wage Gap, Social Mobility, and Unemployment. This data is visualized through choropleths and bar charts. Additionally, panels are used to consolidate the charts into an interactive format.
import altair as alt
import pandas as pd
import numpy as np
import geopandas
from shapely import wkt
!pip install pipwin
!pip install panel
!pipwin install numpy
!pipwin install pandas
!pipwin install shapely
!pipwin install geopandas
import geopandas as gpd
import panel as pn
pn.extension('vega')
Requirement already satisfied: pipwin in c:\users\ericl\anaconda3\lib\site-packages (0.5.1) Requirement already satisfied: requests in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (2.24.0) Requirement already satisfied: beautifulsoup4>=4.9.0 in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (4.9.3) Requirement already satisfied: pyprind in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (2.11.2) Requirement already satisfied: packaging in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (20.4) Requirement already satisfied: js2py in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (0.70) Requirement already satisfied: pySmartDL>=1.3.1; python_version >= "3.4" in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (1.3.4) Requirement already satisfied: six in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (1.15.0) Requirement already satisfied: docopt in c:\users\ericl\anaconda3\lib\site-packages (from pipwin) (0.6.2) Requirement already satisfied: chardet<4,>=3.0.2 in c:\users\ericl\anaconda3\lib\site-packages (from requests->pipwin) (3.0.4) Requirement already satisfied: certifi>=2017.4.17 in c:\users\ericl\anaconda3\lib\site-packages (from requests->pipwin) (2020.6.20) Requirement already satisfied: idna<3,>=2.5 in c:\users\ericl\anaconda3\lib\site-packages (from requests->pipwin) (2.10) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\users\ericl\anaconda3\lib\site-packages (from requests->pipwin) (1.25.11) Requirement already satisfied: soupsieve>1.2; python_version >= "3.0" in c:\users\ericl\anaconda3\lib\site-packages (from beautifulsoup4>=4.9.0->pipwin) (2.0.1) Requirement already satisfied: pyparsing>=2.0.2 in c:\users\ericl\anaconda3\lib\site-packages (from packaging->pipwin) (2.4.7) Requirement already satisfied: pyjsparser>=2.5.1 in c:\users\ericl\anaconda3\lib\site-packages (from js2py->pipwin) (2.7.1) Requirement already satisfied: tzlocal>=1.2 in c:\users\ericl\anaconda3\lib\site-packages (from js2py->pipwin) (2.1) Requirement already satisfied: pytz in c:\users\ericl\anaconda3\lib\site-packages (from tzlocal>=1.2->js2py->pipwin) (2020.1) Requirement already satisfied: panel in c:\users\ericl\anaconda3\lib\site-packages (0.11.3) Requirement already satisfied: bokeh<2.4.0,>=2.3.0 in c:\users\ericl\anaconda3\lib\site-packages (from panel) (2.3.1) Requirement already satisfied: requests in c:\users\ericl\anaconda3\lib\site-packages (from panel) (2.24.0) Requirement already satisfied: markdown in c:\users\ericl\anaconda3\lib\site-packages (from panel) (3.3.4) Requirement already satisfied: param>=1.10.0 in c:\users\ericl\anaconda3\lib\site-packages (from panel) (1.10.1) Requirement already satisfied: pyct>=0.4.4 in c:\users\ericl\anaconda3\lib\site-packages (from panel) (0.4.8) Requirement already satisfied: tqdm in c:\users\ericl\anaconda3\lib\site-packages (from panel) (4.50.2) Requirement already satisfied: pyviz-comms>=0.7.4 in c:\users\ericl\anaconda3\lib\site-packages (from panel) (2.0.1) Requirement already satisfied: pillow>=7.1.0 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (8.0.1) Requirement already satisfied: tornado>=5.1 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (6.0.4) Requirement already satisfied: numpy>=1.11.3 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (1.20.1+mkl) Requirement already satisfied: Jinja2>=2.7 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (2.11.2) Requirement already satisfied: PyYAML>=3.10 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (5.3.1) Requirement already satisfied: typing-extensions>=3.7.4 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (3.7.4.3) Requirement already satisfied: packaging>=16.8 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (20.4) Requirement already satisfied: python-dateutil>=2.1 in c:\users\ericl\anaconda3\lib\site-packages (from bokeh<2.4.0,>=2.3.0->panel) (2.8.1) Requirement already satisfied: idna<3,>=2.5 in c:\users\ericl\anaconda3\lib\site-packages (from requests->panel) (2.10) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\users\ericl\anaconda3\lib\site-packages (from requests->panel) (1.25.11) Requirement already satisfied: chardet<4,>=3.0.2 in c:\users\ericl\anaconda3\lib\site-packages (from requests->panel) (3.0.4) Requirement already satisfied: certifi>=2017.4.17 in c:\users\ericl\anaconda3\lib\site-packages (from requests->panel) (2020.6.20) Requirement already satisfied: MarkupSafe>=0.23 in c:\users\ericl\anaconda3\lib\site-packages (from Jinja2>=2.7->bokeh<2.4.0,>=2.3.0->panel) (1.1.1) Requirement already satisfied: pyparsing>=2.0.2 in c:\users\ericl\anaconda3\lib\site-packages (from packaging>=16.8->bokeh<2.4.0,>=2.3.0->panel) (2.4.7) Requirement already satisfied: six in c:\users\ericl\anaconda3\lib\site-packages (from packaging>=16.8->bokeh<2.4.0,>=2.3.0->panel) (1.15.0) Package `numpy` found in cache Downloading package . . . https://download.lfd.uci.edu/pythonlibs/w4tscw6k/numpy-1.20.1+mkl-cp38-cp38-win_amd64.whl numpy-1.20.1+mkl-cp38-cp38-win_amd64.whl
Traceback (most recent call last):
File "c:\users\ericl\anaconda3\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\users\ericl\anaconda3\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\ericl\anaconda3\Scripts\pipwin.exe\__main__.py", line 7, in <module>
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\command.py", line 103, in main
cache.install(package)
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\pipwin.py", line 300, in install
wheel_file = self.download(requirement)
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\pipwin.py", line 294, in download
return self._download(requirement, dest)
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\pipwin.py", line 290, in _download
obj.start()
File "c:\users\ericl\anaconda3\lib\site-packages\pySmartDL\pySmartDL.py", line 267, in start
urlObj = urllib.request.urlopen(req, timeout=self.timeout, context=self.context)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 531, in open
response = meth(req, response)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 640, in http_response
response = self.parent.error(
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 569, in error
return self._call_chain(*args)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 502, in _call_chain
result = func(*args)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
Package `pandas` found in cache Downloading package . . . https://download.lfd.uci.edu/pythonlibs/w4tscw6k/pandas-1.2.3-cp38-cp38-win_amd64.whl pandas-1.2.3-cp38-cp38-win_amd64.whl
Traceback (most recent call last):
File "c:\users\ericl\anaconda3\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\users\ericl\anaconda3\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\ericl\anaconda3\Scripts\pipwin.exe\__main__.py", line 7, in <module>
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\command.py", line 103, in main
cache.install(package)
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\pipwin.py", line 300, in install
wheel_file = self.download(requirement)
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\pipwin.py", line 294, in download
return self._download(requirement, dest)
File "c:\users\ericl\anaconda3\lib\site-packages\pipwin\pipwin.py", line 290, in _download
obj.start()
File "c:\users\ericl\anaconda3\lib\site-packages\pySmartDL\pySmartDL.py", line 267, in start
urlObj = urllib.request.urlopen(req, timeout=self.timeout, context=self.context)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 531, in open
response = meth(req, response)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 640, in http_response
response = self.parent.error(
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 569, in error
return self._call_chain(*args)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 502, in _call_chain
result = func(*args)
File "c:\users\ericl\anaconda3\lib\urllib\request.py", line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
Package `shapely` found in cache Downloading package . . . https://download.lfd.uci.edu/pythonlibs/w4tscw6k/Shapely-1.7.1-cp38-cp38-win_amd64.whl Shapely-1.7.1-cp38-cp38-win_amd64.whl [*] 0 bytes / 590 kB @ 0 bytes/s [------------------] [0.0%, 0s left] [*] 0 bytes / 590 kB @ 0 bytes/s [------------------] [0.0%, 0s left] [*] 0 bytes / 590 kB @ 0 bytes/s [------------------] [0.0%, 0s left] [*] 24 kB / 590 kB @ 60 kB/s [------------------] [4.1%, 0s left] [*] 200 kB / 590 kB @ 400 kB/s [######------------] [33.9%, 0s left] Requirement already satisfied: Shapely==1.7.1 from file:///C:/Users/ericl/pipwin/Shapely-1.7.1-cp38-cp38-win_amd64.whl in c:\users\ericl\anaconda3\lib\site-packages (1.7.1) [*] 590 kB / 590 kB @ 400 kB/s [##################] [100%, 0s left] Package `geopandas` found in cache Downloading package . . . https://download.lfd.uci.edu/pythonlibs/w4tscw6k/geopandas-0.9.0-py3-none-any.whl geopandas-0.9.0-py3-none-any.whl [*] 0 bytes / 971 kB @ 0 bytes/s [------------------] [0.0%, 0s left] [*] 0 bytes / 971 kB @ 0 bytes/s [------------------] [0.0%, 0s left] [*] 0 bytes / 971 kB @ 0 bytes/s [------------------] [0.0%, 0s left] [*] 72 kB / 971 kB @ 180 kB/s [#-----------------] [7.4%, 0s left] [*] 232 kB / 971 kB @ 464 kB/s [####--------------] [23.9%, 0s left] [*] 680 kB / 971 kB @ 1.1 MB/s [############------] [70.0%, 0s left] Requirement already satisfied: geopandas==0.9.0 from file:///C:/Users/ericl/pipwin/geopandas-0.9.0-py3-none-any.whl in c:\users\ericl\anaconda3\lib\site-packages (0.9.0) Requirement already satisfied: shapely>=1.6 in c:\users\ericl\anaconda3\lib\site-packages (from geopandas==0.9.0) (1.7.1) Requirement already satisfied: pandas>=0.24.0 in c:\users\ericl\anaconda3\lib\site-packages (from geopandas==0.9.0) (1.2.3) Requirement already satisfied: pyproj>=2.2.0 in c:\users\ericl\anaconda3\lib\site-packages (from geopandas==0.9.0) (3.0.1) Requirement already satisfied: fiona>=1.8 in c:\users\ericl\anaconda3\lib\site-packages (from geopandas==0.9.0) (1.8.18) Requirement already satisfied: pytz>=2017.3 in c:\users\ericl\anaconda3\lib\site-packages (from pandas>=0.24.0->geopandas==0.9.0) (2020.1) Requirement already satisfied: python-dateutil>=2.7.3 in c:\users\ericl\anaconda3\lib\site-packages (from pandas>=0.24.0->geopandas==0.9.0) (2.8.1) Requirement already satisfied: numpy>=1.16.5 in c:\users\ericl\anaconda3\lib\site-packages (from pandas>=0.24.0->geopandas==0.9.0) (1.20.1+mkl) Requirement already satisfied: certifi in c:\users\ericl\anaconda3\lib\site-packages (from pyproj>=2.2.0->geopandas==0.9.0) (2020.6.20) Requirement already satisfied: click-plugins>=1.0 in c:\users\ericl\anaconda3\lib\site-packages (from fiona>=1.8->geopandas==0.9.0) (1.1.1) Requirement already satisfied: attrs>=17 in c:\users\ericl\anaconda3\lib\site-packages (from fiona>=1.8->geopandas==0.9.0) (20.3.0) Requirement already satisfied: six>=1.7 in c:\users\ericl\anaconda3\lib\site-packages (from fiona>=1.8->geopandas==0.9.0) (1.15.0) Requirement already satisfied: cligj>=0.5 in c:\users\ericl\anaconda3\lib\site-packages (from fiona>=1.8->geopandas==0.9.0) (0.7.1) Requirement already satisfied: munch in c:\users\ericl\anaconda3\lib\site-packages (from fiona>=1.8->geopandas==0.9.0) (2.5.0) Requirement already satisfied: gdal~=3.2.1 in c:\users\ericl\anaconda3\lib\site-packages (from fiona>=1.8->geopandas==0.9.0) (3.2.2) Requirement already satisfied: click<8,>=4.0 in c:\users\ericl\anaconda3\lib\site-packages (from fiona>=1.8->geopandas==0.9.0) (7.1.2) [*] 971 kB / 971 kB @ 1.1 MB/s [##################] [100%, 0s left]
country_data = pd.read_csv('data_viz_final_project_data.csv')
country_data['geometry'] = country_data['geometry'].apply(wkt.loads)
country_data = gpd.GeoDataFrame(country_data, crs='epsg:4326')
states = geopandas.read_file('gz_2010_us_040_00_5m.json')
us_data = pd.read_csv('Data.csv')
us_data['geometry'] = states['geometry']
us_data = gpd.GeoDataFrame(us_data, crs='epsg:4326')
continents = [None, 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania']
continent_radio = alt.binding_radio(name='Continent', options=continents, labels = ['All', 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania'])
continent_select = alt.selection_single(fields=['continent'], bind=continent_radio, name="continent")
continent_color_condition = alt.condition(continent_select,
alt.Color('continent:N', legend=None),
alt.value('lightgray'))
slider = alt.binding_range(min=np.nanmin(country_data['unemployment']), max=np.nanmax(country_data['unemployment']), step=.1, name='Select Range')
select_year = alt.selection_single(name="unemployment", fields=['unemployment'], bind=slider, init={'unemployment': np.nanmax(country_data['unemployment'])})
base = alt.Chart(country_data).mark_geoshape(invalid=None).encode(
color=alt.condition('datum.unemployment !== null', 'unemployment:Q', alt.value('lightgray')),
tooltip=['name', 'unemployment']
).project(type='albers').properties(
width=800,
height=600
).transform_filter(
continent_select
).project(
'equirectangular'
).properties(
width=500,
height=300
)
highlight_continent = base.add_selection(
continent_select
).encode(
color='unemployment'
).properties(title="Unemployment Choropleth")
filtered_une = country_data[pd.isna(country_data['unemployment']) == False]
bar = alt.Chart(filtered_une).mark_bar(invalid=None).encode(
y = alt.Y('unemployment:Q', axis=alt.Axis(format='f', title='Unemployment')),
x = alt.X('name', sort='-y', axis=alt.Axis(title='Country')),
color = alt.Color('unemployment', legend = alt.Legend(title='Unemployment')),
tooltip = ['name', 'unemployment']
).properties(title='Unemployment Bar Chart'
).add_selection(continent_select
).transform_filter(continent_select).add_selection(
select_year).transform_filter('datum.unemployment <= unemployment_unemployment').properties(
width=1500, height=300)
mean = alt.Chart(filtered_une).mark_rule(color='black', size=3).encode(
y='mean(unemployment):Q'
)
median = alt.Chart(filtered_une).mark_rule(color='gray', size=3).encode(
y='median(unemployment):Q'
)
unemployment_chart = highlight_continent + base | (bar + mean + median)
# unemployment_chart
continents = [None, 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania']
continent_radio = alt.binding_radio(name='Continent', options=continents, labels = ['All', 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania'])
continent_select = alt.selection_single(fields=['continent'], bind=continent_radio, name="continent")
continent_color_condition = alt.condition(continent_select,
alt.Color('continent:N', legend=None),
alt.value('lightgray'))
slider = alt.binding_range(min=np.nanmin(country_data['inflation']), max=np.nanmax(country_data['inflation']), step=.1, name='Select Range')
select_year = alt.selection_single(name="inflation", fields=['inflation'], bind=slider, init={'inflation': np.nanmax(country_data['inflation'])})
base = alt.Chart(country_data).mark_geoshape(invalid=None).encode(
color=alt.condition('datum.newinflation !== null', 'newinflation:Q', alt.value('lightgray')),
tooltip=['name', 'inflation']
).project(type='albers').properties(
width=800,
height=600
).transform_filter(
continent_select
).project(
'equirectangular'
).properties(
width=500,
height=300
)
highlight_continent = base.add_selection(
continent_select
).encode(
color=alt.Color('newinflation')
).properties(title="Inflation Choropleth")
filtered_inf = country_data[pd.isna(country_data['inflation']) == False]
bar = alt.Chart(filtered_inf).mark_bar(invalid=None).encode(
y = alt.Y('inflation:Q', axis=alt.Axis(format='f', title='Inflation')),
x = alt.X('name', sort='-y', axis=alt.Axis(title='Country')),
color = alt.Color('newinflation', legend = alt.Legend(title='Inflation')),
tooltip = ['name', 'inflation']
).properties(title='Inflation Bar Chart').add_selection(continent_select
).transform_filter(continent_select).add_selection(
select_year).transform_filter('datum.inflation <= inflation_inflation').properties(
width=1500, height=300)
mean = alt.Chart(filtered_inf).mark_rule(color='black', size=3).encode(
y='mean(inflation):Q'
)
median = alt.Chart(filtered_inf).mark_rule(color='gray', size=3).encode(
y='median(inflation):Q'
)
inflation_chart = highlight_continent + base | (bar + mean + median)
# inflation_chart
continents = [None, 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania']
continent_radio = alt.binding_radio(name='Continent', options=continents, labels = ['All', 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania'])
continent_select = alt.selection_single(fields=['continent'], bind=continent_radio, name="continent")
continent_color_condition = alt.condition(continent_select,
alt.Color('continent:N', legend=None),
alt.value('lightgray'))
slider = alt.binding_range(min=np.nanmin(country_data['wage_gap']), max=np.nanmax(country_data['wage_gap']), step=.1, name='Select Range')
select_year = alt.selection_single(name="wage_gap", fields=['wage_gap'], bind=slider, init={'wage_gap': np.nanmax(country_data['wage_gap'])})
base = alt.Chart(country_data).mark_geoshape(invalid=None).encode(
color=alt.condition('datum.wage_gap !== null', 'wage_gap:Q', alt.value('lightgray')),
tooltip=['name', 'wage_gap']
).project(type='albers').properties(
width=800,
height=600
).transform_filter(
continent_select
).project(
'equirectangular'
).properties(
width=500,
height=300
)
highlight_continent = base.add_selection(
continent_select
).encode(
color='wage_gap'
).properties(title="Wage Gap Choropleth")
filtered_wag = country_data[pd.isna(country_data['wage_gap']) == False]
bar = alt.Chart(filtered_wag).mark_bar(invalid=None).encode(
y = alt.Y('wage_gap:Q', axis=alt.Axis(format='f', title='Wage Gap')),
x = alt.X('name', sort='-y', axis=alt.Axis(title='Country')),
color = alt.Color('wage_gap', legend = alt.Legend(title='Wage Gap')),
tooltip = ['name', 'wage_gap']
).properties(title='Wage Gap Bar Chart').add_selection(continent_select
).transform_filter(continent_select).add_selection(
select_year).transform_filter('datum.wage_gap <= wage_gap_wage_gap').properties(
width=1500, height=300)
mean = alt.Chart(filtered_wag).mark_rule(color='black', size=3).encode(
y='mean(wage_gap):Q'
)
median = alt.Chart(filtered_wag).mark_rule(color='gray', size=3).encode(
y='median(wage_gap):Q'
)
wage_gap_chart = highlight_continent + base | (bar + mean + median)
# wage_gap_chart
continents = [None, 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania']
continent_radio = alt.binding_radio(name='Continent', options=continents, labels = ['All', 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania'])
continent_select = alt.selection_single(fields=['continent'], bind=continent_radio, name="continent")
continent_color_condition = alt.condition(continent_select,
alt.Color('continent:N', legend=None),
alt.value('lightgray'))
slider = alt.binding_range(min=np.nanmin(country_data['social_mobility']), max=np.nanmax(country_data['social_mobility']), step=.1, name='Select Range')
select_year = alt.selection_single(name="social_mobility", fields=['social_mobility'], bind=slider, init={'social_mobility': np.nanmax(country_data['social_mobility'])})
base = alt.Chart(country_data).mark_geoshape(invalid=None).encode(
color=alt.condition('datum.social_mobility !== null', 'social_mobility:Q', alt.value('lightgray')),
tooltip=['name', 'social_mobility']
).project(type='albers').properties(
width=800,
height=600
).transform_filter(
continent_select
).project(
'equirectangular'
).properties(
width=500,
height=300
)
highlight_continent = base.add_selection(
continent_select
).encode(
color='social_mobility'
).properties(title="Social Mobility Choropleth")
filtered_soc = country_data[pd.isna(country_data['social_mobility']) == False]
bar = alt.Chart(filtered_soc).mark_bar(invalid=None).encode(
y = alt.Y('social_mobility:Q', axis=alt.Axis(title='Social Mobility')),
x = alt.X('name', sort='-y', axis=alt.Axis(title='Country')),
color = alt.Color('social_mobility', legend = alt.Legend(title='Social Mobility')),
tooltip = ['name', 'social_mobility']
).properties(title='Social Mobility Bar Chart').add_selection(continent_select
).transform_filter(continent_select).add_selection(
select_year).transform_filter('datum.social_mobility <= social_mobility_social_mobility').properties(
width=1500, height=300)
mean = alt.Chart(filtered_soc).mark_rule(color='black', size=3).encode(
y='mean(social_mobility):Q'
)
median = alt.Chart(filtered_soc).mark_rule(color='gray', size=3).encode(
y='median(social_mobility):Q'
)
social_mobility_chart = highlight_continent + base | (bar + mean + median)
# social_mobility_chart
continents = [None, 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania']
continent_radio = alt.binding_radio(name='Continent', options=continents, labels = ['All', 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania'])
continent_select = alt.selection_single(fields=['continent'], bind=continent_radio, name="continent")
continent_color_condition = alt.condition(continent_select,
alt.Color('continent:N', legend=None),
alt.value('lightgray'))
slider = alt.binding_range(min=np.nanmin(country_data['poverty']), max=np.nanmax(country_data['poverty']), step=.001, name='Select Range')
select_year = alt.selection_single(name="poverty", fields=['poverty'], bind=slider, init={'poverty': np.nanmax(country_data['poverty'])})
base = alt.Chart(country_data).mark_geoshape(invalid=None).encode(
color=alt.condition('datum.poverty !== null', 'poverty:Q', alt.value('lightgray')),
tooltip=['name', 'poverty']
).project(type='albers').properties(
width=800,
height=600
).transform_filter(
continent_select
).project(
'equirectangular'
).properties(
width=500,
height=300
)
highlight_continent = base.add_selection(
continent_select
).encode(
color='poverty'
).properties(title="Poverty Choropleth")
filtered_pov = country_data[pd.isna(country_data['poverty']) == False]
bar = alt.Chart(filtered_pov).mark_bar(invalid=None).encode(
y = alt.Y('poverty:Q', axis=alt.Axis(format='g', title='Poverty')),
x = alt.X('name', sort='-y', axis=alt.Axis(title='Country')),
color = alt.Color('poverty', legend = alt.Legend(title='Poverty')),
tooltip = ['name', 'poverty']
).properties(title='Poverty Bar Chart').add_selection(continent_select
).transform_filter(continent_select).add_selection(
select_year).transform_filter('datum.poverty <= poverty_poverty').properties(
width=1500, height=300)
mean = alt.Chart(filtered_pov).mark_rule(color='black', size=3).encode(
y='mean(poverty):Q'
)
median = alt.Chart(filtered_pov).mark_rule(color='gray', size=3).encode(
y='median(poverty):Q'
)
poverty_chart = alt.hconcat(highlight_continent + base, (bar + mean + median)).properties(padding=60)
# poverty_chart
continents = [None, 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania']
continent_radio = alt.binding_radio(name='Continent', options=continents, labels = ['All', 'Africa', 'Asia', 'Europe', 'North America', 'South America', 'Oceania'])
continent_select = alt.selection_single(fields=['continent'], bind=continent_radio, name="continent")
continent_color_condition = alt.condition(continent_select,
alt.Color('continent:N', legend=None),
alt.value('lightgray'))
slider = alt.binding_range(min=np.nanmin(country_data['inequality']), max=np.nanmax(country_data['inequality']), step=.01, name='Select Range')
select_year = alt.selection_single(name="inequality", fields=['inequality'], bind=slider, init={'inequality': np.nanmax(country_data['inequality'])})
base = alt.Chart(country_data).mark_geoshape(invalid=None).encode(
color=alt.condition('datum.inequality !== null', 'inequality:Q', alt.value('lightgray')),
tooltip=['name', 'inequality']
).project(type='albers').properties(
width=800,
height=600
).transform_filter(
continent_select
).project(
'equirectangular'
).properties(
width=500,
height=300
)
highlight_continent = base.add_selection(
continent_select
).encode(
color='inequality'
).properties(title="Inequality Choropleth")
filtered_ine = country_data[pd.isna(country_data['inequality']) == False]
bar = alt.Chart(filtered_ine).mark_bar(invalid=None).encode(
y = alt.Y('inequality:Q', axis=alt.Axis(title='Inequality')),
x = alt.X('name', sort='-y', axis=alt.Axis(title='Country')),
color = alt.Color('inequality', legend = alt.Legend(title='Inequality')),
tooltip = ['name', 'inequality']
).properties(title='Inequality Bar Chart').add_selection(continent_select
).transform_filter(continent_select).add_selection(
select_year).transform_filter('datum.inequality <= inequality_inequality').properties(
width=1500, height=300)
mean = alt.Chart(filtered_ine).mark_rule(color='black',size=3).encode(
y='mean(inequality):Q'
)
median = alt.Chart(filtered_ine).mark_rule(color='gray', size=3).encode(
y='median(inequality):Q'
)
inequality_chart = ((highlight_continent + base) | (bar + mean + median))
# inequality_chart
base = alt.Chart(us_data).mark_geoshape(invalid=None).encode(
color='InequalityginiCoefficient',
tooltip=['State', 'InequalityginiCoefficient']
).project(type='albers').properties(
width=800,
height=600
)
bar = alt.Chart(us_data).mark_bar(invalid=None).encode(
y = alt.Y('InequalityginiCoefficient:Q', axis=alt.Axis(format='f', title='Inequality')),
x = alt.X('State', sort='-y'),
color = alt.Color('InequalityginiCoefficient:Q'),
tooltip = ['State', 'InequalityginiCoefficient']
).properties(title='Inequality Bar Chart')
mean = alt.Chart(us_data).mark_rule(color='black', size=3).encode(
y='mean(InequalityginiCoefficient):Q'
)
median = alt.Chart(us_data).mark_rule(color='gray', size=3).encode(
y='median(InequalityginiCoefficient):Q'
)
us_ineq_chart = base | (bar + mean + median)
base = alt.Chart(us_data).mark_geoshape(invalid=None).encode(
color='Wage Gap',
tooltip=['State', 'Wage Gap']
).project(type='albers').properties(
width=800,
height=600
)
bar = alt.Chart(us_data).mark_bar(invalid=None).encode(
y = alt.Y('Wage Gap:Q', axis=alt.Axis(format='f', title='Wage Gap')),
x = alt.X('State', sort='-y'),
color = alt.Color('Wage Gap:Q'),
tooltip = ['State', 'Wage Gap']
).properties(title='Wage Gap Bar Chart')
mean = alt.Chart(us_data).mark_rule(color='black', size=3).encode(
y='mean(Wage Gap):Q'
)
median = alt.Chart(us_data).mark_rule(color='gray', size=3).encode(
y='median(Wage Gap):Q'
)
us_wg_chart = base | (bar + mean + median)
base = alt.Chart(us_data).mark_geoshape(invalid=None).encode(
color='Poverty',
tooltip=['State', 'Poverty']
).project(type='albers').properties(
width=800,
height=600
)
bar = alt.Chart(us_data).mark_bar(invalid=None).encode(
y = alt.Y('Poverty:Q', axis=alt.Axis(format='f', title='Poverty')),
x = alt.X('State', sort='-y'),
color = alt.Color('Poverty:Q'),
tooltip = ['State', 'Poverty']
).properties(title='Poverty Bar Chart')
mean = alt.Chart(us_data).mark_rule(color='black', size=3).encode(
y='mean(Poverty):Q'
)
median = alt.Chart(us_data).mark_rule(color='gray', size=3).encode(
y='median(Poverty):Q'
)
us_pov_chart = base | (bar + mean + median)
base = alt.Chart(us_data).mark_geoshape(invalid=None).encode(
color='Unemployment',
tooltip=['State', 'Unemployment']
).project(type='albers').properties(
width=800,
height=600
)
bar = alt.Chart(us_data).mark_bar(invalid=None).encode(
y = alt.Y('Unemployment:Q', axis=alt.Axis(format='f', title='Unemployment')),
x = alt.X('State', sort='-y'),
color = alt.Color('Unemployment:Q'),
tooltip = ['State', 'Unemployment']
).properties(title='Unemployment Bar Chart')
mean = alt.Chart(us_data).mark_rule(color='black', size=3).encode(
y='mean(Unemployment):Q'
)
median = alt.Chart(us_data).mark_rule(color='gray', size=3).encode(
y='median(Unemployment):Q'
)
us_une_chart = base | (bar + mean + median)
base = alt.Chart(us_data).mark_geoshape(invalid=None).encode(
color='Median Income:Q',
tooltip=['State', 'Median Income']
).project(type='albers').properties(
width=800,
height=600
)
bar = alt.Chart(us_data).mark_bar(invalid=None).encode(
y = alt.Y('Median Income:Q', axis=alt.Axis(format='f', title='Median Income')),
x = alt.X('State', sort='-y'),
color = alt.Color('Median Income:Q'),
tooltip = ['State', 'Median Income']
).properties(title='Median Income Bar Chart')
mean = alt.Chart(us_data).mark_rule(color='black', size=3).encode(
y='mean(Median Income):Q'
)
median = alt.Chart(us_data).mark_rule(color='gray', size=3).encode(
y='median(Median Income):Q'
)
us_medi_chart = base | (bar + mean + median)
base = alt.Chart(us_data).mark_geoshape(invalid=None).encode(
color='2015-2019:Q',
tooltip=['State', '2015-2019']
).project(type='albers').properties(
width=800,
height=600
)
pts = alt.selection(type="single", encodings=['x'])
bar = alt.Chart(us_data).mark_bar(invalid=None).encode(
y = alt.Y('2015-2019:Q', axis=alt.Axis(format='f', title='2015-2019')),
x = alt.X('State', sort='-y'),
color = alt.Color('2015-2019:Q'),
tooltip = ['State', '2015-2019']
).properties(title='Graduation Rate Bar Chart').add_selection(pts).properties(title='Histogram of 2000 Age Distribution')
mean = alt.Chart(us_data).mark_rule(color='black', size=3).encode(
y='mean(2015-2019):Q'
)
median = alt.Chart(us_data).mark_rule(color='gray', size=3).encode(
y='median(2015-2019):Q'
)
state_select = alt.Chart(us_data).transform_fold(['1970','1980','1990','2000','2015-2019'],
as_ = ['Year','Graduation Rate']).mark_bar().encode(
x = alt.X('Year:O'),
y= alt.Y('Graduation Rate:Q'),
tooltip = ['State:N','Graduation Rate:Q']
).properties(height= 200,width = 200).transform_filter(pts).properties().interactive()
us_grad_chart = alt.vconcat( base, ( (bar + mean + median) | state_select ) )
tabs = pn.Tabs()
tabs.append(('Wage Gap',wage_gap_chart))
tabs.append(('Unemployment', unemployment_chart))
tabs.append(('Social Mobility', social_mobility_chart))
tabs.append(('Inflation',inflation_chart))
tabs.append(('Poverty', poverty_chart))
tabs.append(('Inequality', inequality_chart))
us_tabs = pn.Tabs()
us_tabs.append(('Wage Gap',us_wg_chart))
us_tabs.append(('Unemployment', us_une_chart))
us_tabs.append(('Graduation Rate', us_grad_chart))
us_tabs.append(('Median Income',us_medi_chart))
us_tabs.append(('Poverty', us_pov_chart))
us_tabs.append(('Inequality', us_ineq_chart))
full = pn.Tabs()
full.append(("Global Data", tabs))
full.append(("US Data", us_tabs))
full